(defpackage :tutorial 
    (:use :common-lisp :excl :net.aserve :net.html.generator :gen-res :db.agraph.user))

(in-package :tutorial)


(defun rrequest (name req)
  (cdr (assoc name (request-query req) :test #'equal))
  )

(defun text-request (name req)
  (let ( 
        ( r (rrequest name req))
        )
    (if r r " ")
    ))

(defun int-request (name req)
  (let* (
         ( r (rrequest name req))
         ( x (parse-integer r :junk-allowed t))
         ( xx (if x x 0))
         )
    xx
    ))

(defmacro test-html (&rest body)
  `(with-output-to-string  (*html-stream*) ,@body)
  )


(defmacro something (l)
  `(mapcar #'(lambda (it) (html (:princ-safe it))) ,l))
  
  


(defun get-global-id (the-list)
  (let* ((s (with-output-to-string (out) (mapcar #'(lambda (it) (format out "~a" it)) the-list))))
    s))

(defun nice-option (the-name &optional the-value)
  (if the-value
      (html ( (:option :value the-value) (:princ-safe the-name)))
    (html (:option (:princ-safe the-name)))
    ))

(defun nice-list-box (the-name the-options )
  (html ((:select :name the-name)
         (mapcar #'nice-option the-options)
         )))

; assumes id < name in the-options-with-values 
(defun nice-list-box-with-values (the-name the-options-with-values )
  (html ((:select :name the-name)
         
         (mapcar #'(lambda (it) (nice-option (cadr it) (car it))) the-options-with-values)
         ; (mapcar #'nice-option the-options)
         )))



(defmacro nice-text-input (the-name the-value &optional (max-length "80") )
  `(:tr (:td ,the-name) (:td   ((:input :type "text" 
                                        :name ,the-name 
                                        :value ,the-value 
                                        :maxlength ,max-length 
                                        :size ,max-length
                                        ; ,(all-or-nothing disabled "DISABLED")
                                        )))))






(defun get-current-date-in-the-appropriate-format (&optional out )
  (multiple-value-bind (s m h d mo y dow dst tz) (get-decoded-time)
    (declare (ignore s m h dow dst tz))
    (format out "~4,'0d-~2,'0d-~2,'0d" y mo d)))
    





(defun id-from-list (the-list)
  (let ((x (with-output-to-string (out) 
             (mapcar #'(lambda (it) (princ it out)) the-list)
             )))
    (gen-res::crc-s x)))
        







(defun nice-link (rel-path &optional text)
  (if text
      (html ((:a :href rel-path ) text) :br)
    (html ((:a :href rel-path ) rel-path ) :br)
    ))

;;;(defmacro nice-raw-link (rel-path text)
;;;  `((:a :href "list-all-milestones") "list-all-milestones") :br)

    

(defmacro w-select-option-with-selected (text-value comment)
  `(html ((:option value ,text-value :selected "selected") (:princ-safe ,comment))))

  
(defmacro w-select-option-sans-selected (text-value comment)
  `(html ((:option value ,text-value) (:princ-safe ,comment))))


(defun w-select-option (current-value numeric-value text-value comment)
  (if (equal current-value numeric-value)
      (w-select-option-with-selected text-value comment)
    (w-select-option-sans-selected text-value comment)
    ))
    
      
  


(defun submit-button ()
  (html  :p ((:input :type "submit" :value "submit" ) )  )
  )

(defun w-print-description (n)
  (mapcar #'(lambda (it) (html (:td (:princ-safe it)))) n))

(defun w-print-descriptions (n)
  (mapcar #'(lambda (it) (html (:tr (w-print-description it)))) n))





(defmacro mmake-generic-html-sequence ( internal the-list)
  `(mapcar #'(lambda (it) (html (,internal (:princ-safe it)))) ,the-list))

(defmacro make-generic-html-sequence ( external internal the-list)
  `(html ( ,external (mmake-generic-html-sequence ,internal ,the-list ))))

(defun make-uo-list (x)
  (make-generic-html-sequence :ul :li x))


(defun mmake-unordered-list (x)
  (mapcar #'(lambda (it) (html (:li (:princ-safe it)))) x))

(defun make-unordered-list (x)
  (html ( :ul (mmake-unordered-list x))))
  

(defun make-table-cell (x &key bold)
  (if (listp x) (html :td (make-uo-list x))
    (if bold (html (:td (:b (:princ-safe x))))
    (html (:td (:princ-safe x))))
    ))
      


(defun make-row (the-list &key bold)
  (mapcar #'(lambda (it) (make-table-cell it :bold bold)) the-list))
  ; (mapcar #'(lambda (it) (html (:td (:princ-safe it)))) the-list))

(defun mmake-table (the-llist )
  (mapcar #'(lambda (it) (html :tr (make-row it))) the-llist))

(defun make-table (the-llist )
  (html ((:table :bgcolor "white" :bordercolor "black" :border "1" :cellpadding "1" :cellspacing "1")
         (make-row (car the-llist) :bold t)
         (mmake-table (cdr the-llist)))))

(defmacro two-item-table-row (a b)
  `(:tr (:td ,a) (:td ,b)))



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

